#include <iostream>
#include <string>
#include "Log.hpp"
#include "Reactor.hpp"
#include "Connection.hpp"
#include "Listener.hpp"
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " <port>" << std::endl;
        return 1;
    }
    uint16_t local_port = std::stoi(argv[1]);
    Reactor epoll_svr;
    auto conn = std::make_shared<Listener>(local_port);   
    // 有listener模块后，构造服务器也不需要port了
    // 因为传进服务器的port本质就是绑定给listensockfd的，然后listensockfd帮我们监听该端口上的连接
    // 现在我们有了专门的listen模块后，服务器就不需要传入端口了，相当于做了解耦
    //Listener listener(local_port); // 完成具体工作的模块，也有一个listensockfd
    // 因为对于EpollServer来说，它只关心connection，不管是listensockfd还是普通fd

    // 所以我们要把listensockfd，封装成为一个Connection，然后把connection托管给EpollServer

    // auto conn = Factory::BuildConnection(listener.SockFd(), EPOLLIN | EPOLLET, [&listener]()
    //                                      { listener.Acceptor(); }, nullptr, nullptr);
    // 将listener里的获取新连接的函数，封装到connection的回调函数里
    // conn->InitCB([&listener]()
    //              { listener.Acceptor(); }, nullptr, nullptr);


    //这个就是listensockfd的连接
    epoll_svr.InsertConnection(conn);
    epoll_svr.Loop();
    return 0;
}